/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Subqueries;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.scp.dao.IDAOFacturaProforma;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Cotizacion;
import pe.com.cotelasa.scp.entidad.DetallePedidoFp;
import pe.com.cotelasa.scp.entidad.FacturaProforma;

/**
 *
 * @author usuario
 */
@Repository("daoFacturaProforma")
public class DAOFacturaProformaImpl extends DaoImpl<FacturaProforma, Integer> implements IDAOFacturaProforma, Serializable {

    @Autowired
    private SessionFactory sessionFactory;

    @SuppressWarnings("unchecked")
    @Transactional
    @Override
    public FacturaProforma conseguirFacturaProformaPorCodigo(FacturaProforma facturaProforma) throws DAOException {
        FacturaProforma fpBuscar = null;
        try {
            sessionFactory.getCurrentSession().flush();
            fpBuscar = (FacturaProforma) sessionFactory.getCurrentSession().createCriteria(FacturaProforma.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("estadoProforma", "A"))
                    .add(Restrictions.eq("codigoProforma", facturaProforma.getCodigoProforma()))
                    .add(Restrictions.eq("tipoFp", facturaProforma.getTipoFP()))
                    .add(Restrictions.eq("idEmpresa", facturaProforma.getIdEmpresa()))
                    .uniqueResult();

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return fpBuscar;
    }

    @Override
    public FacturaProforma obtenerFPPorCodigo(String codigoFacturaProforma) throws DAOException {
        FacturaProforma fpBuscar = null;
        try {
            sessionFactory.getCurrentSession().flush();
            fpBuscar = (FacturaProforma) sessionFactory.getCurrentSession().createCriteria(FacturaProforma.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("codigoProforma", codigoFacturaProforma))
                    .uniqueResult();

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return fpBuscar;
    }

    @Override
    public Collection<FacturaProforma> buscarFacturasProformaPorFiltro(FacturaProforma facturaProforma, Date fechaInicio, Date fechaFinal) throws DAOException {
        try {
            Collection<FacturaProforma> lista = null;


            Criteria query = sessionFactory.getCurrentSession().createCriteria(FacturaProforma.class)
                    .createAlias("clienteMarca", "cli")
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.like("codigoProforma", "%" + facturaProforma.getCodigoProforma().trim() + "%"))
                    .add(Restrictions.eq("idEmpresa", facturaProforma.getIdEmpresa()))
                    .add(Restrictions.like("tipoFp", facturaProforma.getTipoFP()));

            if (!facturaProforma.getOrigenProducto().equalsIgnoreCase("")) {
                DetachedCriteria subCriteria = DetachedCriteria.forClass(DetallePedidoFp.class)
                        .add(Restrictions.like("nombreProducto", "%" + facturaProforma.getOrigenProducto().trim() + "%"))
                        .setProjection(Projections.distinct(Projections.property("idFacturaProforma")));
                query = query.add(Subqueries.propertyIn("id", subCriteria));
            }

            if (facturaProforma.getClienteMarca() != null) {
                query = query.add(Restrictions.like("estadoProforma", "%" + facturaProforma.getEstadoProforma().trim() + "%"));
                query = query.add(Restrictions.like("cli.razonSocial", "%" + facturaProforma.getClienteMarca().getRazonSocial().trim() + "%"));
            }
            if (facturaProforma.getCodigoSwift() != null) {
                query = query.add(Restrictions.ne("estadoProforma", "E"));
                query = query.addOrder(Order.asc("cli.razonSocial"));
                query = query.addOrder(Order.asc("fecCreacion"));
            } else {
                query = query.addOrder(Order.desc("id"));
            }

            if (fechaInicio == null && fechaFinal == null) {
                System.out.println("entro a todos");
                lista = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                System.out.println("entro a los dos");
                lista = query.add(Restrictions.ge("fechaFacturaProforma", fechaInicio)).add(Restrictions.le("fechaFacturaProforma", fechaFinal)).list();
            } else if (fechaInicio == null) {
                System.out.println("entro a menor");
                lista = query.add(Restrictions.le("fechaFacturaProforma", fechaFinal)).list();
            } else if (fechaFinal == null) {
                System.out.println("entro a final");
                lista = query.add(Restrictions.ge("fechaFacturaProforma", fechaInicio)).list();
            }

            return lista;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }
}
